教程|使用 SOFAMosn 搭建 Service Mesh 平台
The following article is from 金融级分布式架构 Author SOFAMosnLab 伯琴
本文转自【金融级分布式架构】公众号
SOFA
Scalable Open Financial Architecture
是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,是在金融场景里锤炼出来的最佳实践。
本文为《剖析 | SOFAMosn》第二篇。
《剖析 | SOFAMosn》系列由 SOFA 团队和源码爱好者们出品,
项目代号:<SOFA:MosnLab/>,今天开启共建招募,加入方式见底部。
SOFAMosn: https://github.com/alipay/sofa-mosn
本文将介绍如何使用 SOFAMosn 在 SOFAMesh 框架下搭建 Service Mesh 的开发环境,并验证 SOFAMosn 的一些基础路由能力、负载均衡能力等。(点击底部阅读原文,建议 PC 端打开获得更好地阅读体验)
本文介绍的内容将包括 :
SOFAMosn 与 SOFAMesh 的关系
准备工作
源码方式部署 SOFAMesh
Bookinfo 实验
SOFAMosn 与 SOFAMesh 的关系
在上文《【剖析 | SOFAMosn 系列】之 SOFAMosn 的诞生和特性》中,我们介绍过,SOFAMosn 是一款采用 Golang 开发的 Service Mesh 数据平面代理,功能定位类似于 Envoy,而 SOFAMesh 则是基于 Istio 改进和扩展而来的 Service Mesh 大规模落地实践方案, SOFAMosn 是 SOFAMesh 的关键组件。目前由于 SOFAMosn 相比 Envoy 做了一些改造,无法在 Istio 下直接使用,所以本文的实验需要在 SOFAMesh 体系中进行。下图是 SOFAMesh 整体框架下,SOFAMosn 的工作示意图。
一、准备工作
本文以 macOS 为例 ,其他环境可以安装对应版本的软件。
1. 安装 hyperkit
先安装 docker-for-mac,之后安装驱动
1.1 安装 docker
下载软件包安装,或者使用如下的命令安装
$ brew cask install docker
1.2 安装驱动
2. 安装 Minikube(也可以购买商业的 k8s 集群)
推荐使用 Minikube v0.28 以上来体验,请参考 https://github.com/kubernetes/minikube
$ brew cask install minikube
3. 启动 Minikube
注意,pilot 至少需要 2G 内存,所以在启动的时候,可以通过加参数的方法给 minikube 添加分配的资源,如果你机器的资源不够,推荐使用商业版本的 k8s 集群。
$ minikube start --memory=8192 --cpus=4 --kubernetes-version=v1.10.0 --vm-driver=hyperkit
4. 安装 kubectl 命令行工具
kubectl 是用于针对 k8s 集群运行命令的命令行接口,安装参考 https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl
$ brew install kubernetes-cli
5. 安装 Helm
Helm 是一个 k8s 的包管理工具,安装参考 https://docs.helm.sh/using_helm/#installing-helm
$ brew install kubernetes-helm
二、源码方式部署 SOFAMesh
1. 下载 SOFAMesh 源码
$ git clone git@github.com:alipay/sofa-mesh.git
$ cd sofa-mesh
2. 通过 Helm 安装 SOFAMesh
使用 Helm 安装之前,需要先查看 Helm 的版本
$ helm version
如果版本在 2.10 之前,需要手动 安装 istio 的 CRD,否则不需要。(在笔者写此文的时候,安装的 helm 已经是v2.11.0,所以下面的步骤可以直接跳过)
$ kubectl apply -f install/kubernetes/helm/istio/templates/crds.yaml
$ kubectl apply -f install/kubernetes/helm/istio/charts/certmanager/templates/crds.yaml
之后 使用 Helm 安装 ISTIO 有两种方式,这里推荐使用第一种,如果第一种不 work,可以尝试第二种
方式一:使用 helm template
安装
$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml
$ kubectl create namespace istio-system
$ kubectl apply -f $HOME/istio.yaml
如果安装成功后,需要卸载的话:
$ kubectl delete -f $HOME/istio.yaml
方式二:使用 helm install 安装
$ kubectl apply -f install/kubernetes/helm/helm-service-account.yaml
$ helm init --service-account tiller
$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system
如果安装成功后,需要卸载的话:
$ helm delete --purge istio
3. 验证安装
istio-system 命名空间下的 pod 状态都是 Running 时,说明已经部署成功
三、BookInfo 实验
BookInfo 是一个类似豆瓣的图书应用,它包含四个基础服务
Product Page:主页,由 python 开发,展示所有图书信息,它会调用 Reviews 和 Details 服务
Reviews:评论,由 java 开发,展示图书评论,会调用 Ratings 服务
Ratings:评分服务,由 nodejs 开发
Details:图书详情,由 ruby 开发
1. 部署 BookInfo 应用并注入 SOFAMosn
详细过程可以参考 https://istio.io/docs/examples/bookinfo/
注入 SOFAMosn
$ kubectl label namespace default istio-injection=enabled
部署 Bookinfo
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
验证部署是否成功
等待所有的 pods 等成功运行起来
2. 访问 BookInfo 服务
开启 gateway 模式
验证 gateway 是否生效
观察页面情况
访问 http://$GATEWAY_URL/productpage ,正常的话通过刷新会看到如下所示 BookInfo 的界面,其中 Book Reviews 有三个版本,刷新后依次会看到(可以查看 samples/bookinfo/platform/kube/bookinfo.yaml 中的配置发现为什么是这三个版本)
版本一 的界面
版本二 的界面
版本三 的界面
3. 验证 MOSN 按 version 路由能力
首先为 BookInfo 的 service 创建一系列的 destination rules
$ kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
指定 reviews 服务只访问 v1 版本
$ kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml
再次访问 http://$GATEWAY_URL/productpage
发现 reviews 固定在如下版本一的页面不再变化
4. 验证 MOSN 按 weight 路由能力
我们通过下面操作将 v1 和 v3 版本各分配 50% 的流量
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml
再次访问 http://$GATEWAY_URL/productpage
这次 v1 和 v3 各有 1/2 几率出现
5. 验证 MOSN 按照特定 header 路由能力
BookInfo 系统右上角有一个登陆的入口,登陆以后请求会带上 end-user
这个自定义,值是 user name,Mosn 支持根据这个 header 的值来做路由。比如,我们尝试将 jason 这个用户路由到 v2 版本,其他的路由到 v1 版本 (用户名和密码均是:jason,为什么是这个用户可以查看对应的 yaml 文件)
$ kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml
访问 http://$GATEWAY_URL/productpage 时:
以 jason 身份登陆,会看到 v2 版本
以其他身份登陆,始终在 v1 版本
欢迎加入 <SOFA:MosnLab/>,参与 SOFAMosn 源码解析
我们会逐步详细介绍每部分的代码设计和实现,预计会按照如下的目录进行:
【已完成】使用 SOFAMosn 搭建 Service Mesh 平台
【已领取】TLS 支持
【已领取】网络层,协议层扩展点
【已领取】负载均衡原理剖析
【已领取】网络通信与 IO 处理
【待领取】配置文件解析与API模型
【待领取】Istio 对接
【待领取】协议处理及多协议扩展机制
【待领取】跨协议转发引擎机制实现原理剖析
【待领取】后端链接管理,健康检查
【待领取】路由支持及扩展机制剖析
【待领取】无损重启/升级
【待领取】内存复用剖析
领取方式:
直接回复本公众号想认领的文章名称,我们将会主动联系你,确认资质后,即可加入<SOFA:MosnLab/>,It's your show time!
相关链接:
SOFA 文档: http://www.sofastack.tech/
SOFA: https://github.com/alipay
SOFAMosn:
https://github.com/alipay/sofa-mosn
延伸阅读:
开源 | Service Mesh 数据平面 SOFAMosn 深层揭秘
【剖析 | SOFAMosn】系列之 SOFAMosn 的诞生和特性总览
长按关注,获取分布式架构干货
欢迎大家共同打造 SOFAStack https://github.com/alipay
点击【阅读原文】跳转到ServiceMesher网站上浏览可以查看文中的链接。
SOFAMesh(https://github.com/alipay/sofa-mesh)基于Istio的大规模服务网格解决方案
SOFAMosn(https://github.com/alipay/sofa-mosn)使用Go语言开发的高性能Sidecar代理
合作社区
参与社区
以下是参与ServiceMesher社区的方式,最简单的方式是联系我!
加入微信交流群:关注本微信公众号后访问主页右下角有获取联系方式按钮,添加好友时请注明姓名-公司
社区网址:http://www.servicemesher.com
Slack:https://servicemesher.slack.com (需要邀请才能加入)
GitHub:https://github.com/servicemesher
Istio中文文档进度追踪:https://github.com/servicemesher/istio-official-translation
Twitter: https://twitter.com/servicemesher
提供文章线索与投稿:https://github.com/servicemesher/trans